package com.example.j2eeapps.dao;

import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.springframework.util.Assert;

import com.example.j2eeapps.commons.dao.GenericJpaDao;
import com.example.j2eeapps.domain.UserEntity;

/**
 * Data access object JPA impl to work with User Entity database operations
 * @author teo.l.c
 *
 */
public class UserJpaDao extends GenericJpaDao<UserEntity, Long> implements UserDao   {

	public UserJpaDao() {
		super(UserEntity.class);		
	}

	/**
	 * Queries database for user name availability
	 * @param userName
	 * @return true if available
	 */
	public boolean checkAvailable(String userName) {	
		Assert.notNull(userName);
		Query query = getEntityManager()
				.createQuery("select count(*) from " + getPersistentClass().getSimpleName()
						+ " u where u.userName = :userName").setParameter("userName", userName);
		
		Long count = (Long) query.getSingleResult();
		
		return count < 1;
	}

	/**
	 * Queries user by user name
	 * @param userName
	 * @return user entity
	 */
	public UserEntity loadUserByUsername(String userName) {
		Assert.notNull(userName);
		UserEntity user = null;
		Query query = getEntityManager().createQuery("select u from " + getPersistentClass().getSimpleName()
				+ " u where u.userName = :userName").setParameter("userName", userName);
		
		try{
			user=(UserEntity) query.getSingleResult();
		} catch (NoResultException e) {
			// do nothing					
		}		
		
		return user;
	}

}
